package com.adisi.bd;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import com.adisi.objetos.PuntoRuta;
import com.adisi.objetos.Viaje;

public class PuntoRutaDatos {
 
	private Coneccion coneccion;
	
	public PuntoRutaDatos() {
		super();
		
		coneccion = new Coneccion();
	}

	public PuntoRutaDatos(Coneccion coneccion) {
		super();
		
		this.coneccion = coneccion;
	}
	
	
	public boolean grabarNuevoPunto(PuntoRuta punto) throws Exception {
		Connection con = null;
	
		CallableStatement sp = null;
		
		boolean ok = false;
		
		try {
			
			ViajeDatos vd = new ViajeDatos(coneccion);
			
			int id_viaje = vd.conseguirUnViaje(punto.getImei()).getIdViaje();
			
			con = coneccion.conectar();
			
				sp = con.prepareCall("{call sp_Ruta_Insert(?,?,?,?)}");
				
				sp.setInt("id_viaje", id_viaje);
				sp.setString("imei", punto.getImei());
				sp.setFloat("latitud", punto.getLatitud());
				sp.setFloat("longitud", punto.getLongitud());
				
				sp.execute();
				
				ok = true;
				
		} catch (SQLException e) {
			throw e;
		} catch (Exception e) {
			throw e;
		} finally {
			try {
				sp.close();
				con.close();
			} catch (SQLException e) {
				throw e;
			}
		}
		return ok;
		
	}

	public ArrayList<PuntoRuta> conseguirTodosLosPuntos(int idViaje) throws Exception {
		ArrayList<PuntoRuta> puntos = new ArrayList<PuntoRuta>();
		Connection con = null;
		
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Ruta_Select(?)}");
			
			sp.setInt("id_viaje", idViaje);
			
			sp.execute();
			
			rs = sp.getResultSet();
			while (rs.next()) {
				
					PuntoRuta punto = new PuntoRuta(
							rs.getFloat("latitud")
							,rs.getFloat("longitud")
							,rs.getDate("hora")
							,rs.getString("imei")
							);				
					
					puntos.add(punto);
			}
		} catch (SQLException e) {
			throw e;
		} catch (Exception e) {
			throw e;			
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (Exception e) {
				throw e;
			}
		}
		return puntos;	
	}

	public boolean borrarUnaRuta(int idViaje) throws Exception {
		Connection con = null;
		
		CallableStatement sp = null;
		
		boolean ok = false;

		try {
			con = coneccion.conectar();
			sp = con.prepareCall("{call sp_Ruta_Delete(?)}");
			
			sp.setInt("id_viaje", idViaje);
			
			sp.execute();  
			
			
		} catch (Exception e) {
			throw e;
		} finally {
			ok = true;
			try {
				sp.close();
				con.close();
			} catch (Exception e) {
				throw e;
			}
		}
		return ok;
	}
}
